﻿// =============================================
// 定义一个名为 "Custom RP/Lit" 的 Shader
// 属于你的自定义渲染管线（比如 Custom RP / SRP），类似于 URP 中的 Lit Shader
// 用于渲染具备基础光照和 PBR 属性的物体
// =============================================
Shader "Custom RP/Lit"
{
    // =============================================
    // Properties（属性块）
    // 这些属性会显示在 Unity 材质面板中，用于美术或策划调节视觉效果
    // =============================================
    Properties
    {
        // _BaseMap：基础贴图（比如 Albedo / Diffuse 贴图），类型为 2D，默认为白色纹理
        _BaseMap("Texture", 2D) = "white" {}

        // _BaseColor：基础颜色（RGBA），与贴图相乘后决定物体颜色，默认为灰色半透明
        _BaseColor("Color", Color) = (0.5, 0.5, 0.5, 1.0)

        // _Cutoff：Alpha 裁剪阈值，范围 0~1，用于 Alpha Test（硬透明），默认 0.5
        _Cutoff ("Alpha Cutoff", Range(0.0, 1.0)) = 0.5

        // _Clipping：是否启用 Alpha 裁剪功能
        // 这是一个 Toggle 类型的属性，实际传入 Shader 的是 0 或 1
        // 用于控制是否根据 _Cutoff 裁剪掉透明像素
        [Toggle(_CLIPPING)] _Clipping ("Alpha Clipping", Float) = 0

        // _Metallic：金属度，范围 0（非金属）~ 1（全金属），默认 0
        _Metallic ("Metallic", Range(0, 1)) = 0

        // _Smoothness：光滑度，控制镜面反射的锐利程度，范围 0~1，默认 0.5
        _Smoothness ("Smoothness", Range(0, 1)) = 0.5

        // _PremulAlpha：是否启用 Premultiplied Alpha 混合模式
        // 用于优化透明物体渲染，是一个 Toggle（0 或 1）
        [Toggle(_PREMULTIPLY_ALPHA)] _PremulAlpha ("Premultiply Alpha", Float) = 0

        // _SrcBlend：源混合因子，控制源颜色的混合方式，比如 SrcAlpha
        // 可通过下拉菜单选择，使用 Enum 包装，实际传入是 Float（0,1,2...）
        [Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("Src Blend", Float) = 1

        // _DstBlend：目标混合因子，控制目标颜色的混合方式，比如 OneMinusSrcAlpha
        [Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("Dst Blend", Float) = 0

        // _ZWrite：是否开启深度写入，控制物体是否写入深度缓冲，影响遮挡关系
        // Off = 0，On = 1
        [Enum(Off, 0, On, 1)] _ZWrite ("Z Write", Float) = 1
    }

    // =============================================
    // SubShader（子着色器）
    // 一个 Shader 可包含多个 SubShader，Unity 会依次尝试使用第一个兼容的
    // =============================================
    SubShader
    {
        // =============================================
        // Pass（渲染通道）
        // 一个 SubShader 可包含多个 Pass，每个 Pass 代表一次完整的渲染流程
        // 这里定义了一个名为 "CustomLit" 的渲染通道
        // =============================================
        Pass
        {
            // 设置该 Pass 的渲染标签，用于告诉 Unity 渲染管线这是什么 Pass
            // "LightMode" = "CustomLit" 表示这是一个自定义的 Lit（光照）Pass
            // 通常你的渲染管线会根据这个标签来识别并调用该 Pass
            Tags
            {
                "LightMode" = "CustomLit"
            }

            // 设置该 Pass 的混合模式，使用材质面板中定义的 _SrcBlend 和 _DstBlend
            Blend [_SrcBlend] [_DstBlend]

            // 设置该 Pass 是否写入深度缓冲，使用 _ZWrite 控制
            ZWrite [_ZWrite]

            // =============================================
            // HLSLPROGRAM ... ENDHLSL
            // 使用 HLSL 编写该 Pass 的顶点和片段着色器逻辑
            // 这是 Unity SRP（包括 URP / HDRP / 自定义 RP）的标准写法
            // =============================================
            HLSLPROGRAM
            // 指定该 Shader 的目标 Shader Model 版本，3.5 是一个较为通用的 SRP 兼容版本
            #pragma target 3.5

            // 启用 Shader Feature，根据 _CLIPPING 是否为 1 来决定是否编译裁剪相关代码
            #pragma shader_feature _CLIPPING

            // 启用 Shader Feature，根据 _PREMULTIPLY_ALPHA 是否为 1 来决定是否编译预乘 Alpha 相关逻辑
            #pragma shader_feature _PREMULTIPLY_ALPHA

            // 启用 GPU Instancing 支持，允许批量渲染多个相同 Mesh 但不同属性（比如颜色、金属度等）
            #pragma multi_compile_instancing

            // 指定顶点着色器入口函数为 LitPassVertex
            #pragma vertex LitPassVertex

            // 指定片段着色器入口函数为 LitPassFragment
            #pragma fragment LitPassFragment

            // 引入该 Pass 使用的 HLSL 代码文件，通常包含顶点和片段着色器的具体实现
            // 比如：顶点变换、光照计算、PBR 参数处理等
            #include "LitPass.hlsl"

            // HLSL 着色器代码结束
            ENDHLSL
        }
    }

    // =============================================
    // CustomEditor "CustomShaderGUI"
    // 指定该 Shader 使用一个自定义的 Shader GUI 类，用于在材质面板中提供更友好的参数控制界面
    // 比如自定义折叠项、隐藏某些参数、提供工具提示等
    // 该类通常继承自 ShaderGUI，需你自行在 C# 脚本中实现
    // =============================================
    CustomEditor "CustomShaderGUI"
}